using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.DirectX;
using Microsoft.DirectX.Direct3D;
using TgcViewer;

namespace AlumnoEjemplos.TP3D
{
    public class EnElPiso : EstadoMario
    {
        #region EstadoMario Members

        float cuantoPaso = 0;
        private Plataforma _plataforma = null;

        public EnElPiso(Plataforma p)
        {
            this._plataforma = p;
        }

        public void Avanza(Mario mario)
        {
            Vector3 velocidad = mario.VelocidadCaminar;
            velocidad.Multiply(-1f);
            mario.MoveTo(this._plataforma.MovimientoSegun(velocidad, mario.Position));
        }

        public void Retrocede(Mario mario)
        {
            mario.MoveTo(this._plataforma.MovimientoSegun(mario.VelocidadCaminar, mario.Position));
        }

        public void Salta(Mario mario)
        {
            mario.MoveTo(Mario.VELOCIDAD_SALTO + mario.Velocidad);
            mario.Estado = new Saltando(mario.Velocidad);
            mario.DoAnimacionSalto();
            this._plataforma.RemoveGuest(mario);
        }

        public void Update(Mario mario, float elapsedTime)
        {
            if (!this._plataforma.EstasEn(mario.Position.X, mario.Position.Z) &&
                this._plataforma is Box)
            {
                mario.Cae();
            }

            if (!this._plataforma.EstasEn(mario.Position.X, mario.Position.Z) &&
                this._plataforma is Terreno)
            {
                return;
            }

            if (mario.HasRotation)
            {
                mario.Mesh.rotateY(Geometry.DegreeToRadian(mario.Rotacion * elapsedTime));
                GuiController.Instance.ThirdPersonCamera.rotateY(Geometry.DegreeToRadian(mario.Rotacion * elapsedTime));
            }

            if (mario.HasMoved)
            {
                float z = (float)Math.Cos((float)mario.Mesh.Rotation.Y) * mario.Velocidad.Z;
                float x = (float)Math.Sin((float)mario.Mesh.Rotation.Y) * mario.Velocidad.Z;
                float y = this._plataforma.GetAltura(mario.Mesh.Position);
                mario.Mesh.move(x, y - mario.Mesh.Position.Y, z);
            }

            if (!mario.HasMoved)
            {
                mario.DoAnimacionParate();
            }
            else
            {
                mario.DoAnimacionCaminar();
            }
        }

        public void Init(Mario mario)
        {
            mario.Velocidad = Mario.MOVIMIENTO_NULO;
            mario.Rotacion = Mario.VELOCIDAD_ROTACION_INCIAL;
        }

        #endregion

        #region EstadoMario Members


        public void Cae(Mario mario)
        {
            mario.MoveTo(-Mario.VELOCIDAD_SALTO + mario.Velocidad);
            mario.Estado = new Saltando(mario.Velocidad);
            this._plataforma.RemoveGuest(mario);
        }

        #endregion
    }
}
